#include <vector>
#include <fstream>
#include <iostream>

using namespace std;

/*
 * fstNo - 第一牛的编号
 * sndNo - 第二牛的编号
 * scores - 一轮表演所有牛的表现
 * 返回，fstNo 的表现是否比 sndNo 好
 */
bool better(int fstNo, int sndNo, vector<int> scores) {
  // fstNo 和 sndNo 谁在 scores 中的前面
  // 4 1 2 3

  // 找 fstNo 和 sndNo 这两个数字在 scores 中的位置
  int fstPos = 0, sndPos = 0;

  for (int i = 0; i < scores.size(); ++i) {
    if (scores.at(i) == fstNo) {
      fstPos = i;
    }

    if (scores.at(i) == sndNo) {
      sndPos = i;
    }
  }

  return fstPos < sndPos;
}

/*
 * 作业1:
 * 基于我们课上编写的 better 函数，编写 allBetter 函数，它返回在所有轮的体操
 * 表演中，编号为 fstNo 的奶牛的表现，是否好于 sndNo
 */
int allBetter(int fstNo, int sndNo, vector<vector<int>> scores) {
  // 在这里实现
  int total = 0;
  for (vector<int> round : scores) {
    if (better(fstNo, sndNo, round)) {
      ++total;
    }
  }

  return total;
}

int main(int argc, char const *argv[])
{
  /* code */
  // 处理程序输入
  int rounds = 0, cows = 0;

  ifstream ifs("CowGymnastics.in");
  ifs >> rounds >> cows;

  /*
  rounds 行，cows 列
  {
    {0, 0, 0, 0},
    {0, 0, 0, 0},
    {0, 0, 0, 0}
  }
  */
  vector<int> records(cows, 0);
  vector<vector<int>> scores(rounds, records);

  // scores
  for (int row = 0; row < rounds; ++row) {
    for (int col = 0; col < cows; ++col) {
      ifs >> scores[row][col];
    }
  }

  for (vector<int> records : scores) {
    for (int n : records) {
      cout<< n << " ";
    }
    cout<<endl;
  }

  // 如何判断在一轮体操训练里，两头牛的成绩关系
  // {4 1 2 3}

  // 作业2
  // 在下面这个双层 for 循环中，使用 作业1 编写的 allBetter 函数
  // 判断所有可能的一致组合
  
  int pairs = 0; // 一致牛的对数

  for (int i = 1; i <= cows; ++i) {
    for (int j = 1; j <= cows; ++j) {
      // 把 i 和 j 组合起来，得到的就是要比较的一对奶牛的编号
      // (1, 1) / (1, 2) / (1, 3) ...
      // (2, 1) / (2, 2) / (2, 3) ...
      
      int n = allBetter(i, j, scores);

      if (n == scores.size()) {
        ++pairs;
      }
    }
  }

  ofstream ofs("CowGymnastics.out");
  ofs << pairs;
  
  return 0;
}
